package cn.tedu.submarine;

import java.awt.*;
import javax.swing.ImageIcon;
import java.util.Random;

//海洋对象类，是所有类的超类
public abstract class SeaObject {
    /**
     *  活着的
     */
    public static final int LIVE = 0;
    /**
     * 死了的
     */
    public static final int DEAD = 1;
    private int state = LIVE; //当前状态(默认为活着)
    protected int width;  //宽
    protected int height; //高
    protected int x;  //x坐标
    protected int y;  //y坐标
    protected int speed;//速度



    public static int getLIVE() {
        return LIVE;
    }

    public static int getDEAD() {
        return DEAD;
    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    /**
     * 专门给侦察潜艇、鱼雷潜艇、水雷潜艇提供的构造方法
     * @param width   潜艇的宽
     * @param height   潜艇的高
     */
    public SeaObject(int width, int height){
        this.width = width;
        this.height = height;
        x = -width;
        Random rand = new Random();
        y = rand.nextInt(World.HEIGHT- height-150+1)+150;
        speed = rand.nextInt(3)+1;


    }

    /**
     * 专门给战舰、水雷、炸弹提供的构造方法
     * @param width 宽
     * @param height 高
     * @param x x坐标
     * @param y y坐标
     * @param speed 速度
     */
    public SeaObject(int width, int height,int x, int y, int speed){
        this.width = width;
        this.height = height;
        this.x = x;
        this.y = y;
        this.speed = speed;
    }
    /**
     * 移动
     */
    public abstract void move();

    /**
     * 获取对象的图片
     * @return 返回对象所对应的图片
     */
    public abstract ImageIcon getImage();

    /**
     * 判断对象是否是活着的
     * @return  返回true表示活着的。否则表示死了的
     */
    public boolean isLive(){
        return state==LIVE;
    }
    /**
     * 判断对象是否是死了的
     * @return 返回true表示死了的，否则表示活着的
     */
    public boolean isDead(){
        return state == DEAD;
    }
    /**
     * 画对象
     * @param g 画笔
     */
    public void paintImage(Graphics g){
        if(this.isLive()){//如果活着的
            this.getImage().paintIcon(null,g,this.x,this.y);
        }
    }

    /**
     * 检测潜艇是否越界
     * @return 若越界则返回true，否则返回false
     */
    public boolean isOutOfBounds(){
        return this.x>=World.WIDTH; //潜艇的x>=窗口的宽，即为越界了
    }

    /**
     * 检测碰撞
     * @param other 另一个对象  this表示一个对象
     * @return 若撞上了则返回true，否则返回false
     */
    public boolean isHit(SeaObject other){
        //假设:this为潜艇，other为炸弹
        int x1 = this.x-other.width;  //x1:潜艇的x-炸弹的宽
        int x2 = this.x+this.width;   //x2:潜艇的x+潜艇的宽
        int y1 = this.y-other.height; //y1:潜艇的y-炸弹的高
        int y2 = this.y+this.height;  //y2:潜艇的y+潜艇的高
        int x = other.x; //x:炸弹的x
        int y = other.y; //y:炸弹的y     //练习-----------2:34继续

        return x>=x1 && x<=x2
                &&
                y>=y1 && y<=y2; //x在x1与x2之间，并且，y在y1与y2之间，即为撞上了
    }

    public  void goDead(){
        state = DEAD; //将当前状态修改为DEAD死了的
    }
}
